#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;


void readVector(float x[], int l)
{
	int i;
	for (i=0; i<l; i++){
		cout<<"a["<<i<<"]=";
		cin>>x[i];
		cout<<"\n";
	}
}
void readVector(int x[], int l)
{
	int i;
	for (i=0; i<l; i++){
		cout<<"v"<<"["<<i<<"]=";
		cin>>x[i];
		cout<<"\n";
	}
}
void readVector(char x[], int l)
{
	int i;
	for (i=0; i<l; i++){
		cout<<"a["<<i<<"]=";
		cin>>x[i];
		cout<<"\n";
	}
}




void printVector(float x[], int l)
{
	int i;
	for (i=0; i<l; i++){
		cout<<x[i]<<" ";
	}
	cout<<"\n";
}
void printVector(int x[], int l)
{
	int i;
	for (i=0; i<l; i++){
		cout<<x[i]<<" ";
	}
	cout<<"\n";
}

void print3intVectors(int x[], int xl, int y[], int yl, int z[], int zl)
{
	printVector(x, xl);
	printVector(y, yl);
	printVector(z, zl);
}

void printVector(char x[], int l)
{
	int i;
	for (i=0; i<l; i++){
		cout<<x[i]<<" ";
	}
	cout<<"\n";
}

int minofVector(float x[], int l)
{
	int i, min, pos;
	min=x[0];
	for (i=1; i<l; i++)
		if (x[i]<min){
			min=x[i];
			pos=i;
		}
	return pos;
}

int maxofVector(float x[], int l)
{
	int i, max, pos;
	max=x[0];
	for (i=1; i<l; i++)
		if (x[i]>max){
			max=x[i];
			pos=i;
		}
return pos;
}
int minofVector(int x[], int l)
{
	int i, min, pos;
	min=x[0];
	for (i=1; i<l; i++)
		if (x[i]<min){
			min=x[i];
			pos=i;
		}
	return pos;
}

int maxofVector(int x[], int l)
{
	int i, max, pos;
	max=x[0];
	for (i=1; i<l; i++)
		if (x[i]>max){
			max=x[i];
			pos=i;
		}
return pos;
}
int max(int a, int b)
{
	if(a>b)
		return a;
	else 
		return b;
}
int max3(int a, int b, int c)
{
	if (a>b){
		if(a>c)
			return a;
		else 
			return c;
	}
	else 
		if(b>c)
			return b;
		else
			return c;
}


void swap_minmaxVector(float x[],int l, int min, int max)
{
	int i;
	i=x[min];
	x[min]=x[max];
	x[max]=i;
}

void mirror(char x[], int l)
{
	int i,j, aux;
	i=0;
	j=l-1;
	while (i<j){
		aux=x[i];
		x[i]=x[j];
		x[j]=aux;
		++i;
		--j;
	}
}
void mirror(int x[], int l)
{
	int i,j, aux;
	i=0;
	j=l-1;
	while (i<j){
		aux=x[i];
		x[i]=x[j];
		x[j]=aux;
		++i;
		--j;
	}
}

void strcpy(char source[], char destination[], int length)
{
	int i, l=length;
	for (i=0; i<l; i++)
		destination[i]=source[i];
}


void arrcpy(int source[], int destination[], int length)
{
	int i, l=length;
	for (i=0; i<l; i++)
		destination[i]=source[i];
}



int posofmax(float x[], float s[], int l)
{
	int i, ls=0, max, j=0 ;
	max=maxofVector(x, l);
	for (i=0; i<l; i++)
		if (x[i]==max){
			s[j]=i;
			++j;
			++ls;
		}
return 	ls;
}

float sumofVector(float x[], int l)
{	
	int i;
	float sum=0;
	for (i=0;i<l;i++)
		sum += x[i];
	return sum;
}
int sumofVector(int x[], int l)
{	
	int i;
	float sum=0;
	for (i=0;i<l;i++)
		sum += x[i];
	return sum;
}
float prodofVector(float x[],int l)
{
	float prod=1;
	int i;
	for (i=0;i<l;i++)
		prod *= x[i];
return prod;
}
int prodofVector(int x[],int l)
{
	float prod=1;
	int i;
	for (i=0;i<l;i++)
		prod *= x[i];
return prod;
}

int positiveNo(float x[], int l)
{
	int p=0;
	int i;
	for (i=0;i<l;i++)
		if (x[i]>0)
			p++;

return p;
}

int negativeNo(float x[], int l)
{
	int n=0;
	int i;
	for (i=0;i<l;i++)
		if (x[i]<0)
			n++;

return n;
}
int zeroNo(float x[], int l)
{
	int z=0;
	int i;
	for (i=0;i<l;i++)
		if (x[i]==0)
			z++;

return z;
}

int positivesofVector(float x[], float s[], int l)
{
	int pl, i;
	for (i=0; i<l; i++)
		if (x[i]>0){
			s[pl]=x[i];
			++pl;
		}
return pl;}

int modulok(int x[], int s[], int l, int k)
{
	int i, kl=0;
	for (i=0;i<l;i++)
		if(x[i]%k==0){
			s[kl]=x[i];
			++kl;
		}
return kl;
}

int modulok(int x[], int l, int k)
{
	int i, j;
	int kl=l;
	for (i=0;i<kl;i++)
		if (x[i]%k!=0){
			for (j=i;j<kl;j++)			
				x[j]=x[j+1];
			--kl;
			--i;
		}
return kl;
}
int isprime(int n)
{
	int i;
	for (i=2; i<n/2; i++)
		if (n%i==0)
			return 0;
return 1;
}
int nonzeroes(int x[], int nonzero[], int l)
{
	int i;
	int nzl=0;
	for (i=0; i<l; i++)
		if (x[i]!=0) {
			nonzero[nzl]=x[i];
			nzl++;
		}
return nzl;
}
int primes(int x[], int primes[], int l)
{
	int i;
	int pl=0;
	for (i=0; i<l; i++)
		if (isprime(x[i])!=0) {
			primes[pl]=x[i];
			pl++;
		}
		else cout<<x[i]<<" is not prime";
return pl;
}

void reverseVector_m(char x[],int l, int m)
{
	int i=0,j=l-1;
	char aux;
	while (i<m){
		aux=x[i];
		x[i]=x[j];
		x[j]=aux;
		++i;
		--j;
	}
}
int no_in_vector(float x[], int length, char number)
{
	int i,l=length, b=number;
	for (i=0;i<l;i++)
		if(x[i]==b)
			return i;
return 0;
}
int no_in_vector(int x[], int length, int number)
{
	int i,l=length, b=number;
	for (i=0;i<l;i++)
		if(x[i]==b)
			return i;
return -1;
}
int gcd(int a, int b)
{
	if ((a%b)==0)
        	return b;
    	else
        	return gcd(b,a%b);
}
int lcm(int a, int b)
{
	int lcm;
	lcm=(abs(a*b)/gcd(a,b));
return lcm;
}

int power(int base, int exp)
{
	if (exp==0)
		return 1;
	else if (exp==1)
		return base;
	else 
		return base*power(base, exp-1);
}

int isFibonacci(int n)
{
	int i;
	int fibonacci[50];
	if(n==0 || n==1)
		return 1;	
	fibonacci[0]=0;
	fibonacci[1]=1;
	for(i=2;i<50;i++){
		fibonacci[i]= fibonacci[i-1] + fibonacci[i-2];
		if(n==fibonacci[i])
			return 1;	
	}
return 0;
}

int isprime(int a, int b)
{
	if(gcd(a, b)==1)
		return 1;
return 0;
}

void ascsort(int x[], int l)
{
	int i, j, aux;
	for(i=1; i<l; ++i){
		aux=x[i];
		j=i-1;
		while (aux<x[j] && j>=0){
			x[j+1]=x[j];
			--j;
		}
		x[j+1]=aux;
	}
			
}

#endif // FUNCTIONS_H_INCLUDED
